/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package GUI;

import Facade.Facade;
import GUI.tabelas.tabelaProdutos;
import Objetos.Conta;
import Objetos.Dia;
import Objetos.Movimentacao;
import Objetos.Parcela;
import Objetos.Produto;
import Objetos.Produto_OS;
import Objetos.Usuario;
import Objetos.ValoresFixos;
import com.toedter.calendar.JDateChooser;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.text.ParseException;
import java.util.Calendar;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author celio
 */
public class AcompanhamentoOS extends JPanel {

    JButton encerrar, inserir, limpar;
    JLabel formaPag, parcelas, obs, valor, os, placa, codItem, qtdProduto, valorItem, valorGasto, tValorGasto, itensGastosOS;
    JComboBox tFormaPag,tTipo;
    public static JTextField tParcelas, tObs, tValor, tOs, tPlaca, tCOdItem, tDescItem, tValorItem, tQtdProduto;
    JTable servicos, servico, itens;
    JScrollPane scrollerServicos, scrollerServico, scrollerItens;
    DefaultTableModel dtm;
    Calendar data;
    Vector linhas, dados, cabecalho;
    Vector vetorParcela = null;
    JDateChooser dataPag;
    Facade fa;
    String tipos[] = {"","Avulso","Parcelas"};

    public AcompanhamentoOS(final Usuario usu) {

        JLabel tela = new JLabel("... :::   Acompanhamento de OS   ::: ...");
        tela.setBounds(400, 10, 500, 20);
        add(tela);

        data = Calendar.getInstance();
        dataPag = new JDateChooser();
         
        os = new JLabel("OS: ");
        tOs = new JTextField();

        placa = new JLabel("Placa: ");
        tPlaca = new JTextField();

        valor = new JLabel("Valor: ");
        tValor = new JTextField();

        tTipo = new JComboBox(tipos);
        formaPag = new JLabel("Forma de pagamento: ");
        fa = new Facade();
        tFormaPag = new JComboBox(fa.todas_CondicaoePagamento(usu));

        parcelas = new JLabel("Parcelas: ");
        tParcelas = new JTextField();

        obs = new JLabel("Observação: ");
        tObs = new JTextField();

        itensGastosOS = new JLabel("==== Itens gastos no serviço ====");
        codItem = new JLabel("Cód: ");
        tCOdItem = new JTextField();

        tDescItem = new JTextField();

        qtdProduto = new JLabel("Qtd: ");
        tQtdProduto = new JTextField();

        valorItem = new JLabel("Valor: ");
        tValorItem = new JTextField();

        valorGasto = new JLabel("Valor gasto: ");
        tValorGasto = new JLabel();

        encerrar = new JButton("Encerrar");
        inserir = new JButton("Inserir");
        limpar = new JButton("Limpar");

        cabecalho = new Vector();
        linhas = new Vector();
        dados = new Vector();

        cabecalho.addElement("Cód");
        cabecalho.addElement("Item");
        cabecalho.addElement("Qtd.");
        cabecalho.addElement("Valor");

        itens = new JTable(linhas, cabecalho);
        itens.setFont(new Font("Times New Roman", Font.BOLD, 14));
        dtm = (DefaultTableModel) itens.getModel();
        scrollerItens = new JScrollPane(itens, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        itens.getColumnModel().getColumn(0).setPreferredWidth(50);
        itens.getColumnModel().getColumn(1).setPreferredWidth(200);
        itens.getColumnModel().getColumn(2).setPreferredWidth(30);
        itens.getColumnModel().getColumn(3).setPreferredWidth(70);

        vetorParcela = new Vector();

        os.setBounds(10, 50, 150, 20);
        tOs.setBounds(150, 50, 150, 20);

        placa.setBounds(10, 80, 150, 20);
        tPlaca.setBounds(150, 80, 150, 20);

        valor.setBounds(10, 110, 150, 20);
        tValor.setBounds(150, 110, 150, 20);

        formaPag.setBounds(10, 140, 150, 20);
        tFormaPag.setBounds(150, 140, 150, 20);

        parcelas.setBounds(10, 170, 100, 20);
        tParcelas.setBounds(150, 170, 30, 20);
        tTipo.setBounds(250, 170, 80, 20);
        dataPag.setBounds(10, 170, 100, 20);
        
        obs.setBounds(10, 200, 100, 20);
        tObs.setBounds(150, 200, 200, 20);

        itensGastosOS.setBounds(50, 230, 200, 20);
        codItem.setBounds(10, 260, 50, 20);
        tCOdItem.setBounds(70, 260, 50, 20);
        tDescItem.setBounds(130, 260, 100, 20);
        qtdProduto.setBounds(10, 290, 50, 20);
        tQtdProduto.setBounds(70, 290, 50, 20);
        valorItem.setBounds(150, 290, 50, 20);
        tValorItem.setBounds(200, 290, 50, 20);

        valorGasto.setBounds(10, 350, 100, 20);
        tValorGasto.setBounds(10, 380, 100, 20);

        encerrar.setBounds(10, 420, 100, 20);
        inserir.setBounds(10, 320, 100, 20);
        limpar.setBounds(110, 420, 100, 20);

        scrollerItens.setBounds(110, 320, 240, 100);

        add(os);
        add(tOs);
        add(placa);
        add(tPlaca);
        add(valor);
        add(tValor);
        add(formaPag);
        add(tFormaPag);
        add(tTipo);
        add(dataPag);
        add(parcelas);
        add(tParcelas);
        add(obs);
        add(tObs);
        add(itensGastosOS);
        add(codItem);
        add(tCOdItem);
        add(tDescItem);
        add(qtdProduto);
        add(tQtdProduto);
        add(valorItem);
        add(tValorItem);
        add(valorGasto);
        add(tValorGasto);
        add(inserir);
        add(encerrar);
        add(limpar);
        add(scrollerItens);

        tOs.setEditable(false);
        tPlaca.setEditable(false);
        tValor.setEditable(false);
        tDescItem.setEditable(false);
        tValorItem.setEditable(false);
        tValorGasto.setForeground(Color.red);
        parcelas.setVisible(false);
        tParcelas.setVisible(false);
        dataPag.setVisible(false);
        tTipo.setVisible(false);

        atualizaTabela(usu);
        removeLabelItensUsados();

        servicos.addMouseListener(new MouseListener() {

            @Override
            public void mouseClicked(MouseEvent e) {

                tOs.setText(servicos.getValueAt(servicos.getSelectedRow(), 0).toString());
                tPlaca.setText(servicos.getValueAt(servicos.getSelectedRow(), 1).toString());
                tValor.setText(servicos.getValueAt(servicos.getSelectedRow(), 6).toString());

                try {
                    remove(scrollerServico);

                } catch (NullPointerException ex) {
                }
                fa = new Facade();
                servico = fa.filtrarServicosOS_OS(servicos.getValueAt(servicos.getSelectedRow(), 0).toString(),usu);
                servico.setFont(new Font("Times New Roman", Font.BOLD, 14));
                scrollerServico = new JScrollPane(servico, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
                scrollerServico.setBounds(350, 270, 720, 200);
                add(scrollerServico);

                adicionaLabelItensUsados();

            }

            @Override
            public void mousePressed(MouseEvent e) {
            }

            @Override
            public void mouseReleased(MouseEvent e) {
            }

            @Override
            public void mouseEntered(MouseEvent e) {

            }

            @Override
            public void mouseExited(MouseEvent e) {
            }
        });

        tCOdItem.addKeyListener(new KeyListener() {

            @Override
            public void keyTyped(KeyEvent e) {
               // throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public void keyPressed(KeyEvent e) {
            
                if(e.getKeyCode()==118){
                    
                    tabelaProdutos tp = new tabelaProdutos(usu);
                    
                }
                
            }

            @Override
            public void keyReleased(KeyEvent e) {
               // throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }
        });
        
        tCOdItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                fa = new Facade();
                Produto produto = fa.procurar_Produto(tCOdItem.getText(),usu);
                tDescItem.setText(produto.getDescProduto());
                try {
                    tValorItem.setText(Funcoes.funcoes.paraFormatoDinheiro(Double.parseDouble(Funcoes.funcoes.formatoParaInserir(produto.getValor()))));
                } catch (ParseException ex) {
                    Logger.getLogger(AcompanhamentoOS.class.getName()).log(Level.SEVERE, null, ex);
                }

            }
        });
        
         tTipo.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
            
                if(tTipo.getSelectedIndex()==1){
                    
                    parcelas.setVisible(false);
                    tParcelas.setVisible(false);
                    tParcelas.setEditable(false);
                    tParcelas.setText("1");
                    dataPag.setVisible(true);
                    
                }else
                    if(tTipo.getSelectedIndex()==2){
                        
                        parcelas.setVisible(true);
                        tParcelas.setVisible(true);
                        tParcelas.setEditable(true);
                        tParcelas.setText("");
                        dataPag.setVisible(false);
                        
                    }
                
            }
        });

          tFormaPag.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                if (tFormaPag.getSelectedIndex() == 1) {

                    tTipo.setVisible(false);
                    tParcelas.setEditable(false);
                    tParcelas.setText("1");

                } else {

                   tTipo.setVisible(true);

                }

            }
        });
        
        encerrar.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                fa = new Facade();

                int tParc = Integer.parseInt(tParcelas.getText());
                Double total = 0.0;
                try {
                    total = Double.parseDouble(Funcoes.funcoes.formatoParaInserir(tValor.getText()));
                } catch (ParseException ex) {
                    Logger.getLogger(AcompanhamentoOS.class.getName()).log(Level.SEVERE, null, ex);
                }
                for (int a = 1; a <= tParc; a++) {

                    if (tFormaPag.getSelectedIndex() == 1) {

                        Movimentacao mov = new Movimentacao();
                        fa = new Facade();
                        Dia dia = fa.verificarUltimoDia_Dia(usu);

                        mov.setTipo("Serviço");
                        mov.setDescricao("Pagamento da OS: " + tOs.getText());

                        mov.setData(Funcoes.funcoes.paraInserirData(data.getTime().toLocaleString().substring(0, 10)));
                        mov.setIddia(dia.getCodDia());
                        try {
                            mov.setValor(Funcoes.funcoes.formatoParaInserir(tValor.getText()));
                        } catch (ParseException ex) {
                            Logger.getLogger(AcompanhamentoOS.class.getName()).log(Level.SEVERE, null, ex);
                        }
                        fa.inserir_Movimentacao(mov,usu);
                        Dia alteraSaldo = new Dia();
                        alteraSaldo.setCodDia(dia.getCodDia());
                        double saldoAntes = Double.parseDouble(dia.getSaldo_atual());
                        double valor = 0.0;
                        try {
                            valor = Double.parseDouble(Funcoes.funcoes.formatoParaInserir(tValor.getText()));
                        } catch (ParseException ex) {
                            Logger.getLogger(AcompanhamentoOS.class.getName()).log(Level.SEVERE, null, ex);
                        }
                        String saldoAtual = Double.toString(saldoAntes + valor);
                        alteraSaldo.setSaldo_atual(saldoAtual);

                        fa.alterarSaldo_Dia(alteraSaldo,usu);

                    } else {
                        if(tTipo.getSelectedIndex()==2){
                        Parcela parcelasPedido = new Parcela();
                        data.add(Calendar.MONTH, 1);
                        parcelasPedido.setCod_pedido(tOs.getText());
                        parcelasPedido.setCod_cliente(fa.procurar_Cliente(fa.procurar_OS(tOs.getText(),usu).getCliente(),usu).getCod_cliente());
                        parcelasPedido.setCod_condicao(pegaCodCondicao(tFormaPag.getSelectedItem().toString()));
                        parcelasPedido.setValor(Double.toString(total / tParc));
                        parcelasPedido.setDescricao("Parcela: " + a + "/" + tParc + " da OS: " + tOs.getText());
                        parcelasPedido.setData_pagamento(Funcoes.funcoes.paraInserirData(data.getTime().toLocaleString().substring(0, 10)));
                        parcelasPedido.setTipo(ValoresFixos.TipoParcela.entrada.getTipo());
                        vetorParcela.add(parcelasPedido);
                     
                        }else{
                            if(tTipo.getSelectedIndex()==1){
                                
                        Parcela parcelasPedido = new Parcela();
                        data.add(Calendar.MONTH, 1);
                        parcelasPedido.setCod_pedido(tOs.getText());
                        parcelasPedido.setCod_cliente(fa.procurar_Cliente(fa.procurar_OS(tOs.getText(),usu).getCliente(),usu).getCod_cliente());
                        parcelasPedido.setCod_condicao(pegaCodCondicao(tFormaPag.getSelectedItem().toString()));
                        parcelasPedido.setValor(Double.toString(total / tParc));
                        parcelasPedido.setDescricao("Parcela: " + a + "/" + tParc + " da OS: " + tOs.getText());
                        parcelasPedido.setData_pagamento(Funcoes.funcoes.paraInserirData(dataPag.getDate().toLocaleString().substring(0, 10)));
                        parcelasPedido.setTipo(ValoresFixos.TipoParcela.entrada.getTipo());
                        vetorParcela.add(parcelasPedido);
                                
                            }
                            }
                        }
                }
                Calendar data_Hoje = Calendar.getInstance();
                String dataHoje = data_Hoje.getTime().toLocaleString().substring(0, 10);
                for (int a = 0; a < vetorParcela.size(); a++) {

                    Parcela parcelaInserir = (Parcela) vetorParcela.elementAt(a);
                    fa.inserirParcela_Parcela(parcelaInserir,usu);
                    fa = new Facade();

                    Conta conta = new Conta();
                    conta.setDescricao(parcelaInserir.getDescricao());
                    conta.setValor(parcelaInserir.getValor());
                    conta.setDataInclusao(Funcoes.funcoes.paraInserirData(dataHoje));
                    conta.setDataExecucao(parcelaInserir.getData_pagamento());
                    conta.setTipo(ValoresFixos.TipoConta.entrada.getTipo());
                    conta.setStatus(ValoresFixos.StatusConta.aberta.getStatus());

                    fa.adicionar_Conta(conta, usu);

                }
                fa.encerrar_OS(tOs.getText(),usu);
                int rows = dtm.getRowCount();
                for (int a = 0; a < rows; a++) {
                    Produto produto = fa.procurar_Produto(itens.getValueAt(a, 0).toString(),usu);
                    int novoSaldo = Integer.parseInt(produto.getQtd()) - Integer.parseInt(itens.getValueAt(a, 2).toString());
                    fa.vender_Produto(produto, novoSaldo,usu);

                    Produto_OS proOS = new Produto_OS();
                    proOS.setIdOS(tOs.getText());
                    proOS.setIdProduto(itens.getValueAt(a, 0).toString());
                    proOS.setQtd(itens.getValueAt(a, 2).toString());
                    fa.inserirProduto_OS_Produto(proOS,usu);
                }

                limparTudo(usu);

            }

        });

       inserir.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                fa = new Facade();
                Produto produto = fa.procurar_Produto(tCOdItem.getText(),usu);
                double valor = 0;
                try {
                    valor = Double.parseDouble(Funcoes.funcoes.formatoParaInserir(produto.getValor()));
                } catch (ParseException ex) {
                    Logger.getLogger(AcompanhamentoOS.class.getName()).log(Level.SEVERE, null, ex);
                }
                int campoQtd = Integer.parseInt(tQtdProduto.getText());
                double valorProdutos = valor * campoQtd;
                dtm.addRow(new Object[]{tCOdItem.getText(), produto.getDescProduto(), tQtdProduto.getText(), Funcoes.funcoes.paraFormatoDinheiro(valorProdutos)});
                tCOdItem.setText("");
                tDescItem.setText("");
                tQtdProduto.setText("");
                tValorItem.setText("");
                try {
                    tValorGasto.setText(Funcoes.funcoes.calculaTotal(itens, 3, "+"));
                } catch (ParseException ex) {
                    Logger.getLogger(AcompanhamentoOS.class.getName()).log(Level.SEVERE, null, ex);
                }

            }
        });

        limpar.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

                removeLabelItensUsados();
                limparTudo(usu);

            }
        });

        setLayout(null);
        setBackground(Color.LIGHT_GRAY);
        setBorder(BorderFactory.createBevelBorder(1, Color.DARK_GRAY, Color.DARK_GRAY));
        setSize(800, 800);
        setVisible(true);
        revalidate();
        repaint();
    }

    private void atualizaTabela(Usuario usu) {

        try {
            remove(scrollerServicos);

        } catch (NullPointerException e) {
        }
        fa = new Facade();
        servicos = fa.listarTodosAbertos_OS(usu);
        servicos.setFont(new Font("Times New Roman", Font.BOLD, 14));
        scrollerServicos = new JScrollPane(servicos, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        scrollerServicos.setBounds(350, 50, 720, 200);
        add(scrollerServicos);
    }

    private String pegaCodCondicao(String condicao) {

        String retorno = null;
        for (int a = 0; a <= condicao.length(); a++) {

            if (condicao.charAt(a) != '-') {

                retorno = condicao.substring(0, a + 1);
                return retorno;
            } else {
                return null;
            }

        }
        return null;

    }

    private void limparTudo(Usuario usu) {

        tOs.setText("");
        tValor.setText("");
        tPlaca.setText("");
        tObs.setText("");
        tParcelas.setText("");
        tCOdItem.setText("");
        tDescItem.setText("");
        tQtdProduto.setText("");
        tValorItem.setText("");
        tFormaPag.setSelectedIndex(0);
        removeLabelItensUsados();
        scrollerServico.setVisible(false);
        atualizaTabela(usu);

    }

    private void removeLabelItensUsados() {

        tCOdItem.setText("");
        tDescItem.setText("");
        tQtdProduto.setText("");
        tValorItem.setText("");
        tValorGasto.setText("");

        int rows = dtm.getColumnCount();
        for (int a = 0; a <= rows; a++) {
            while (dtm.getRowCount() != 0) {
                dtm.removeRow(0);
            }
        }

        itensGastosOS.setVisible(false);
        codItem.setVisible(false);
        tCOdItem.setVisible(false);
        tDescItem.setVisible(false);
        qtdProduto.setVisible(false);
        tQtdProduto.setVisible(false);
        valorItem.setVisible(false);
        tValorItem.setVisible(false);
        valorGasto.setVisible(false);
        tValorGasto.setVisible(false);
        scrollerItens.setVisible(false);
        inserir.setVisible(false);

    }

    private void adicionaLabelItensUsados() {

        tCOdItem.setText("");
        tDescItem.setText("");
        tQtdProduto.setText("");
        tValorItem.setText("");
        tValorGasto.setText("");

        int rows = dtm.getColumnCount();
        for (int a = 0; a <= rows; a++) {
            while (dtm.getRowCount() != 0) {
                dtm.removeRow(0);
            }
        }
        itensGastosOS.setVisible(true);
        codItem.setVisible(true);
        tCOdItem.setVisible(true);
        tDescItem.setVisible(true);
        qtdProduto.setVisible(true);
        tQtdProduto.setVisible(true);
        valorItem.setVisible(true);
        tValorItem.setVisible(true);
        valorGasto.setVisible(true);
        tValorGasto.setVisible(true);
        scrollerItens.setVisible(true);
        inserir.setVisible(true);
        scrollerItens.setVisible(true);

    }

}
